#pragma once

#include <iostream>
#include <fstream>
#include <string>
#include <istream>
#include <ostream>
#include <vector>
#include <map>
#include <unordered_map>
#include <memory>
#include <filesystem>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <random>
#include <cstdint>  
#include <locale>
#include <codecvt>

namespace fs = std::filesystem;

#include "assimp/Importer.hpp"
#include "assimp/postprocess.h"
#include "assimp/scene.h"

#include "mustache.hpp"

#include "ztclog/ztclog.h"

#include <glm/glm.hpp>
#include <glm/common.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtx/matrix_decompose.hpp>


#define FXCC_SUCCESS(X)     \
    do {                    \
        if (X) return true; \
    } while (0)

#define FXCC_FAILED(X)      \
    do {                    \
        if (!(X)) return false; \
    } while (0)

#define FXCC_FAILED_X(X, Y)     \
    do {                        \
        if (!(X)) {             \
            ztclog::info(Y);    \
            return false;       \
        }                       \
    } while (0)


#define FXCC_BREAK(X) \
    if (X)            \
    return



#ifdef _WIN32
#define FXCC_IMPORT __declspec(dllimport)
#define FXCC_EXPORT __declspec(dllexport)
#ifdef FXCC_EXPORTS
#define FXCC_API __declspec(dllexport)
#else
#define FXCC_API  __declspec(dllimport)
#endif
#else
#endif

#ifdef FXCC_USE_SHARED_LIB
#else
#define FXCC_API
#endif

#ifndef FXCC_ASSERT_PATH
#define FXCC_ASSERT_PATH
#endif 